home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / prolog / brklyprl.lha / Comp / valvar.pl < prev    next >
Text File  |  1989-04-14  |  3KB  |  103 lines

  1.  
  2. /* Copyright (C) 1988, 1989 Herve' Touati, Aquarius Project, UC Berkeley */
  3.  
  4. /* Copyright Herve' Touati, Aquarius Project, UC Berkeley */
  5.  
  6. % Value-variable annotation:
  7. % Assumes that initializations of variables
  8. % that needed it have been added to the code.
  9. % Assumes that code still contains disjunction structure.
  10.  
  11. % Pass 1: First occurrences of all variables are
  12. %      marked 'variable'.  All variables occurring
  13. %      first in a 'put' are marked unsafe.  Later,
  14. %      'excess' will only allow permanents to keep
  15. %      the unsafe annotation.
  16. % Pass 2: Do a reverse pass.  First encounters of
  17. %      unsafe variables are marked 'unsafe_value',
  18. %      unless they are already marked 'variable'.
  19. %      All other encounters with variables are marked
  20. %      'value'.
  21.  
  22. % Must be done before temporary variable allocation and
  23. % after calculation of permanent variables.
  24.  
  25. % Variables encountered so far are kept in the set SoFar
  26. % in both passes.  This set is passed in parallel across
  27. % disjunctions, and the different SoFar's are united upon
  28. % exiting disjunctions.
  29.  
  30. % Top level:
  31. valvar(PartObj, HeadVars) :-
  32.     valvar1(PartObj, [], PossUnSafe, [], _), !,
  33.     diffv(PossUnSafe, HeadVars, UnSafe),
  34.     valvar2(PartObj, UnSafe, [], _), !.
  35.  
  36. % Pass 1:
  37. valvar1(V, UnSafe, UnSafe, SF, SF) :- (var(V);V=[]).
  38.  
  39. valvar1([(A;B)|RestCode], InUS, OutUS, SoFar, OutSF) :-
  40.     disvalvar1((A;B), InUS, US1, SoFar, NewSF),
  41.     valvar1(RestCode, US1, OutUS, NewSF, OutSF).
  42. valvar1([G-L|RestCode], InUS, OutUS, SoFar, OutSF) :-
  43.     valvar1(G, InUS, US1, SoFar, NewSF),
  44.     valvar1(RestCode, US1, OutUS, NewSF, OutSF).
  45. valvar1([I|RestInstr], InUS, OutUS, SoFar, OutSF) :-
  46.     type_arg(I, T, X), !,
  47.     (notin(X, SoFar) , T=variable; true),
  48.     new_us(I, X, SoFar, InUS, US1),
  49.     unionv([X], SoFar, NewSF),
  50.     valvar1(RestInstr, US1, OutUS, NewSF, OutSF).
  51. valvar1([_|RestInstr], InUS, OutUS, SoFar, OutSF) :-
  52.     valvar1(RestInstr, InUS, OutUS, SoFar, OutSF).
  53.  
  54.     new_us(I, X, SoFar, InUS, US1) :-
  55.         I=put(_,_,_), notin(X, SoFar), !, 
  56.         unionv([X], InUS, US1).
  57.     new_us(I, X, SoFar, InUS, InUS).
  58.  
  59. disvalvar1((A;B), InUS, OutUS, SoFar, OutSF) :-
  60.     valvar1(A, InUS, US1, SoFar, Out1),
  61.     disvalvar1(B, US1, OutUS, SoFar, Out2),
  62.     unionv(Out1, Out2, OutSF).
  63. disvalvar1(B, InUS, OutUS, SoFar, OutSF) :-
  64.     valvar1(B, InUS, OutUS, SoFar, OutSF).
  65.  
  66. % Pass 2:
  67. valvar2(V, _, SF, SF) :- (var(V); V=[]).
  68.  
  69. valvar2([(A;B)|RestCode], UnSafe, SoFar, OutSF) :-
  70.     valvar2(RestCode, UnSafe, SoFar, NewSF),
  71.     disvalvar2((A;B), UnSafe, NewSF, OutSF).
  72. valvar2([G-L|RestCode], UnSafe, SoFar, OutSF) :-
  73.     valvar2(RestCode, UnSafe, SoFar, NewSF),
  74.     valvar2(G, UnSafe, NewSF, OutSF).
  75. valvar2([I|RestInstr], UnSafe, SoFar, OutSF) :-
  76.     type_arg(I, T, X), !,
  77.     valvar2(RestInstr, UnSafe, SoFar, NewSF),
  78.     choose_annotation(X, UnSafe, NewSF, T),
  79.     unionv([X], NewSF, OutSF).
  80. valvar2([_|RestInstr], UnSafe, SoFar, OutSF) :-
  81.     valvar2(RestInstr, UnSafe, SoFar, OutSF).
  82.  
  83.     choose_annotation(X, UnSafe, NewSF, T) :-
  84.         in(X, UnSafe), notin(X, NewSF), !,
  85.         make_unsafe_value(T).
  86.     choose_annotation(X, UnSafe, NewSF, T) :-
  87.         make_value(T).
  88.  
  89. disvalvar2((A;B), UnSafe, SoFar, OutSF) :-
  90.     valvar2(A, UnSafe, SoFar, Out1),
  91.     disvalvar2(B, UnSafe, SoFar, Out2),
  92.     unionv(Out1, Out2, OutSF).
  93. disvalvar2(B, UnSafe, SoFar, OutSF) :-
  94.     valvar2(B, UnSafe, SoFar, OutSF).
  95.  
  96. % Make unsafe_value if possible
  97. make_unsafe_value(unsafe_value) :- !.
  98. make_unsafe_value(_) :- !.
  99.  
  100. % Make value if possible
  101. make_value(value) :- !.
  102. make_value(_) :- !.
  103.